#!/usr/bin/env python
from fastapi import FastAPI
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langserve import add_routes
import os

print("LangServe是LangChain生态系统中的一个专门模块，它的主要目的就是将 LangChain 的链（Chain）、代理（Agent）和其他可运行对象（Runnable）部署为 RESTful API 服务")

# 设置千问模型的API配置
os.environ["OPENAI_API_KEY"] = "sk-4e88cf4db3e14894bafaff606d296610"  # 替换为实际的千问API密钥
os.environ["OPENAI_API_BASE"] = "https://dashscope.aliyuncs.com/compatible-mode/v1"  # 千问兼容模式端点

app = FastAPI(
    title="LangChain Server",
    version="1.0",
    description="A simple api server using Langchain's Runnable interfaces",
    docs_url=None,  # 禁用 Swagger UI（与Pydantic版本不兼容性，访问相关url会出错，故禁用）
    redoc_url=None,  # 禁用 ReDoc（与Pydantic版本不兼容性，访问相关url会出错，故禁用）
    openapi_url=None,  # 禁用 OpenAPI 文档（与Pydantic版本不兼容性，访问相关url会出错，故禁用）
)

# 创建千问模型实例
qwen_model = ChatOpenAI(
    model="qwen-max",  # 或其他千问模型，如 qwen-plus、qwen-turbo 等
    openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

add_routes(
    app,
    qwen_model,
    path="/qwen",
)

prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")

"""自动为 Chain 创建完整的 REST API。这会自动生成：
POST /my-chain/invoke - 同步调用
POST /my-chain/stream - 流式输出
POST /my-chain/batch - 批量处理
GET /my-chain/input_schema - 输入模式
GET /my-chain/output_schema - 输出模式
"""
add_routes(
    app,
    prompt | qwen_model,
    path="/joke",
    )

# 手动添加一个简单的根端点用于测试
@app.get("/")
async def root():
    return {"message": "LangChain Server is running", "endpoints": ["/qwen", "/joke"]}

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8000)